﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcCaja.Core;
using MvcCaja.Dal.Models;

namespace MvcCaja.Controllers
{
    public class MovimientosController : Controller
    {

        public ActionResult Index()
        {
            CajaService oCajaService = new CajaService();
            //List<MovimientoCaja> oMovimientoCaja = oCajaService.ListarMovimientos();
            List<MovimientoCaja> oMovimientoCaja = ListMovimientosCaja("","","","");

            //Combo Bovedas
            BovedaService oBovedaService = new BovedaService();
            List<Boveda> listaBovedas = oBovedaService.ObtenerTodos();
            ViewBag.ListBoveda = new SelectList(listaBovedas, "IdBoveda", "NombreBoveda");

            //Combo Caja
            List<Caja> listaCajas = oCajaService.ObtenerTodos();
            ViewBag.ListCajas = new SelectList(listaCajas, "IdCaja", "NombreCaja");    
            

            return View(oMovimientoCaja);
        }

        public JsonResult registrarMovimientoBoveda(decimal monto, string tipoMovimiento, string boveda)
        {
            String suser = Session["user"].ToString();
            String sCaja = Session["Caja"].ToString();
            String sTurno = Session["Turno"].ToString();

            BovedaService oBovedaService = new BovedaService();
            string resultado = oBovedaService.insertar(boveda, sCaja, sTurno, suser, tipoMovimiento, monto);

            return Json(new { result = resultado });
        }

        public JsonResult AnularMovimiento(string codigo, string codigoAdministrador, string concepto)
        {
            string resultado = string.Empty;
            switch (codigo.Substring(0, 1).ToUpper()) { 
                case "O":
                    PagoService oPagoService = new PagoService();
                    resultado = oPagoService.anular(codigo, codigoAdministrador, concepto);
                    break;

                case "B":
                    BovedaService oBovedaService = new BovedaService();
                    resultado = oBovedaService.anular(codigo, codigoAdministrador, concepto);
                    break;
            }            
            
            return Json(new { result = resultado });
        }

        public ActionResult ListMovimientos(string fecIni, string fecFin, string caja, string empleado)
        {
            CajaService oCajaService = new CajaService();
            BovedaService oBovedaService = new BovedaService();

            List<MovimientoCaja> oMovimientoCaja = ListMovimientosCaja(fecIni, fecFin, caja, empleado); //oCajaService.ListarMovimientos(fecIni, fecFin, caja, empleado);
            //List<MovimientoBoveda> oMovimientoBoveda = oBovedaService.ListarMovimientos(fecIni, fecFin, caja, empleado);

            //return View("_ListMovimientos", oMovimientoCaja);
            return PartialView("_ListMovimientos", oMovimientoCaja);
        }

        private List<MovimientoCaja> ListMovimientosCaja(string fecIni, string fecFin, string caja, string empleado)
        {

            List<MovimientoCaja> oListMovimientoCaja = new List<MovimientoCaja>();

            DateTime DfecIni = (!fecIni.Equals("")) ? DateTime.Parse(fecIni) : DateTime.Parse("01/01/1800");
            DateTime DfecFin = (!fecFin.Equals("")) ? DateTime.Parse(fecFin) : DateTime.Now;

            BovedaService oBovedaService = new BovedaService();
            List<MovimientoBoveda> oMovimientoBoveda = oBovedaService.ListarMovimientos(DfecIni, DfecFin, caja, empleado);

            foreach (MovimientoBoveda _boveda in oMovimientoBoveda) {
                MovimientoCaja oMovimientoCaja = new MovimientoCaja();               
                oMovimientoCaja.IdOrden = _boveda.IdBoveda;
                oMovimientoCaja.IdCajero = _boveda.IdCajero;
                oMovimientoCaja.TipoMovimiento = _boveda.TipoMovimiento;
                oMovimientoCaja.FechaHoraMovimiento = _boveda.FechaHoraMovimiento;
                oMovimientoCaja.MontoMovimiento = _boveda.MontoMovimiento;
                oMovimientoCaja.IdCaja = _boveda.IdCaja;

                oListMovimientoCaja.Add(oMovimientoCaja);
            }

            PagoService oPagoService = new PagoService();
            List<Pago> oPago = oPagoService.Movimientos(DfecIni, DfecFin, caja, empleado);

            string codigoOrden = string.Empty;

            MovimientoCaja oMovimientoCajaPago = null;
            int cantMovimientoPago = oPago.Count;
            int contar = 0;

            foreach (Pago _pago in oPago)
            {
                contar++;
                if (!codigoOrden.Equals(_pago.IdOrden))
                {
                    if(!codigoOrden.Equals(string.Empty)) {
                        oListMovimientoCaja.Add(oMovimientoCajaPago);
                    }
                    oMovimientoCajaPago = new MovimientoCaja();
                    CajaService oCajaService = new CajaService();

                    codigoOrden = _pago.IdOrden;
                    oMovimientoCajaPago.IdOrden = _pago.IdOrden;
                    MovimientoCaja _obj = oCajaService.ObtenerMovimientoCaja(_pago.IdOrden, _pago.FechaHoraEmision);
                    oMovimientoCajaPago.IdCajero = _obj.IdCajero;
                    oMovimientoCajaPago.IdCaja = _obj.IdCaja;
                    oMovimientoCajaPago.TipoMovimiento = "Consumo";
                    oMovimientoCajaPago.FechaHoraMovimiento = _pago.FechaHoraEmision;
                    oMovimientoCajaPago.MontoMovimiento = _pago.Total;

                    //oListMovimientoCaja.Add(oMovimientoCajaPago);
                }
                else {
                    oMovimientoCajaPago.MontoMovimiento += _pago.Total;
                }

                if (contar == cantMovimientoPago)
                {
                    oListMovimientoCaja.Add(oMovimientoCajaPago);                
                }
                
            }

            var listMovimientos = from m in oListMovimientoCaja
                                  orderby m.FechaHoraMovimiento descending
                                  select m;

            return listMovimientos.ToList<MovimientoCaja>();        
        }

        public ActionResult verMovimiento(string id)
        {
            PartialViewResult pv = new PartialViewResult();
            switch (id.Substring(0, 1).ToUpper()) {
                case "O":
                    CajaService oCajaService = new CajaService();
                    List<MovimientoCaja> oMovimientoCaja = oCajaService.ListarMovimientosPorPago(id);
                    pv = PartialView("_verMovimientos", oMovimientoCaja);
                    break;
                case "B":
                    BovedaService oBovedaService = new BovedaService();
                    MovimientoBoveda oMovimientoBoveda = oBovedaService.obtenerMovimiento(id);
                    pv = PartialView("_verMovimiento", oMovimientoBoveda);
                    break;
            }
            return pv;
        }


        public JsonResult validarAdministrador(string usuario, string pass)
        {
            CajaService oCajaService = new CajaService();
            int cantusuario = oCajaService.validarUsuario(usuario,pass);

            return Json(new { result = cantusuario });
        }
    }
}
